define(function(require, exports, module) {
	'use strict';
    
    
    var scheduleUtil = {};

	(function(){
		
		var doSort = function(list){
			list = sortByStart(list); 		
			list = sortByEnd(list);
			list = sortById(list);
			return list;
		};
		//scheduleUtil.sortDayEvents = doSort;
		scheduleUtil.sortDayEvents = function(arr){
			return doSort(arr);
		};
		var sortById = function (dirtyList){
			var prevStartEnd;
			var subArr = [];
			var mainArr = [subArr];
			for(var i = 0, len = dirtyList.length;i<len;i++){
				var dirtyItem = dirtyList[i];
				var startend = dirtyItem.startMS + '_' + dirtyItem.endMS;
				if(startend != prevStartEnd){
					if(subArr.length > 0){//sort 'end'
						var arr = _.sortBy(subArr, function(it) { return it.id; });
						mainArr[mainArr.length-1] = arr;
						//print(arr, '-->');
					}
					subArr = [dirtyItem];
					mainArr.push(subArr);
				}else{
					subArr.push(dirtyItem);
				}		
				prevStartEnd = startend;
			}
			var resultList = [];
			for(var i = 0, len = mainArr.length;i<len;i++){
				var sub = mainArr[i];
				for(var j = 0, lenj = sub.length;j<lenj;j++){
					resultList.push(sub[j]);
				}
			}
			return resultList;
		};
		var sortByEnd = function (dirtyList){
			var prevStart;
			var subArr = [];
			var mainArr = [subArr];
			for(var i = 0, len = dirtyList.length;i<len;i++){
				var dirtyItem = dirtyList[i];
				var start = dirtyItem.startMS;
				if(start != prevStart){
					if(subArr.length > 0){//sort 'end'
						var arr = _.sortBy(subArr, function(it) { return it.endMS; });
						mainArr[mainArr.length-1] = arr;
					}
					subArr = [dirtyItem];
					mainArr.push(subArr);
				}else{
					subArr.push(dirtyItem);
				}		
				prevStart = start;
			}
			var resultList = [];
			for(var i = 0, len = mainArr.length;i<len;i++){
				var sub = mainArr[i];
				for(var j = 0, lenj = sub.length;j<lenj;j++){
					resultList.push(sub[j]);
				}
			}
			return resultList;
		};
		var sortByStart = function (list){

			list = _.sortBy(list, function(item) { return item.startMS; });

			return list;
		};
	})();

	return scheduleUtil;

});